/**    
 * @Description: 博客园地址：https://www.cnblogs.com/zumengjie/      
 * @author: 顶风少年   
 * @date: 2021年4月9日 上午10:45:47
 */

package datang.dtdb.scripting.defaults;

import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import datang.dtdb.exceptions.ParameterHandlerException;
import datang.dtdb.exceptions.ParsingException;
import datang.dtdb.executor.parameter.ParameterHandler;
import datang.dtdb.mapping.BoundSql;
import datang.dtdb.mapping.MappedStatement;
import datang.dtdb.mapping.ParameterMapping;
import datang.dtdb.reflection.MetaObject;
import datang.dtdb.type.SimpleTypeRegistry;

/**
 * 默认的参数处理器实现
 */
public class DefaultParameterHandler implements ParameterHandler {

	/**
	 * 可以从中获取BoundSql
	 */
	private MappedStatement mappedStatement;

	/**
	 * 调用时传调用的mappendStatement
	 */
	public DefaultParameterHandler(MappedStatement mappedStatement) {
		this.mappedStatement = mappedStatement;
	}

	/**
	 * 将 ？设置到PreparedStatement中 TODO 未完成应该处理多种参数类型
	 */
	@Override
	public void setParameters(PreparedStatement ps, Object parameter) {
		BoundSql boundSql = mappedStatement.getBoundSql(parameter);
		List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
		for (int i = 0; i < parameterMappings.size(); i++) {
			ParameterMapping parameterMapping = parameterMappings.get(i);
			String property = parameterMapping.getProperty();
			Object value = null;

			try {
				// 处理入参是简单类型的情况
				if (SimpleTypeRegistry.isSimpleType(parameter.getClass())) {
					value = String.valueOf(parameter);
				} else {
					MetaObject metaObject = mappedStatement.getConfiguration().newMetaObject(parameter);
					value = metaObject.getValue(property);
				}
				if (value == null) {
					throw new RuntimeException();
				} else {
					ps.setObject(i + 1, value);
				}

			} catch (Exception e) {
				throw new ParameterHandlerException("设置参数异常", e);
			}

		}
	}

}
